/**
 * Equivalent du sprintf. Ne gère que les commandes :
 *
 * 		- s : conversion simple en string
 * 		- c : affichage du caractère associé au code ASCII passé,
 * 		- u : conversion numérique
 *
 * Gère également le padding.
 */
if (String.format === undefined) {
	var regex = /%%|%(?:([a-zA-Z]+)\$)?([ 0])?(\d+)?(\.(\d+))?([scu])/g;
	var handlers = {
			s: function (v) {
					return '' + v;
				},
			c: function (v) {
					return String.fromCharCode(v);
				},
			u: function (v) {
					if (v.toFixed === undefined) v = parseFloat(v);
					return v.toFixed(0);
				}
		};

	var pad = function (str, padChar, minWidth) {
			if (str.length >= minWidth) {
				return str;
			} else {
				return Array(minWidth + 1 - str.length).join(padChar) + str;
			}
		};

	var fn = function () {
			var values = Array.prototype.slice.call(arguments, 0), isObject = false;
			if (values.length == 1 && values[0] instanceof Object) {
				values = values[0];
				isObject = true;
			}

			var callback = function (str, argName, padChar, minWidth, _, precision, type) {
					padChar = padChar || ' ';
					var value = isObject ? values[argName] : values.shift();
					var str = value == null ? 'null' : handlers[type].call(null, value, parseInt(precision || 0));
					return pad(str, padChar, parseInt(minWidth || 0));
				};

			return this.replace(regex, callback);
		};

	String.prototype.format = fn;

	String.format = function (fmt) {
		return fn.apply(fmt, Array.prototype.slice.call(arguments, 1));
	};
}

if (Array.inArray === undefined) {
	/**
	 * Fonction permettant de rechercher une valeur dans un tableau
	 * @param valeur : element à rechercher
	 * @param tableau :  tableau dans lequel se fera la recherche
	 * @return bool
	 */	
	Array.prototype.inArray = function(valeur, tableau){
		for(elt in tableau){
			if(tableau[elt] == valeur) return true;
		}
		return false;
	}
}
